查看原文
其他

面试官:有一个 List 对象集合,如何优雅地返回给前端?我懵了。。

点击关注 👉 顶级架构师 2023-09-18
推荐关注
顶级架构师后台回复 1024 有特别礼包


来源:liuchenyang0515.blog.csdn.net/article/details/118159196

上一篇:7个点 5 种 API 网关技术整理


大家好,我是顶级架构师。


  • 1.业务背景
  • 2.实体类
  • 3.自定义Mapper和xml文件
  • 4.Service层
  • 5.Controller层

1.业务背景

业务场景中,一个会话中存在多个场景,即一个session_id对应多个scene_idscene_name。另外,搜索公众号顶级科技后台回复“API接口”,获取一份惊喜礼包。

如果你写成如下的聚合模型类

public class SceneVO private String sessionId; private String sceneId; private String sceneName; // 省略对应的getter和setter方法}

返回的List<SceneVO>形式如下,这个数据在data属性中

"data":[  {   "sessionId""jksadhjksd",   "sceneId":"NDJWKSDSJKDKED",   "sceneName":"场景1"  },  {   "sessionId""jksadhjksd",   "sceneId":"KLJSDJKLSDFALK",   "sceneName":"场景2"  },  {   "sessionId""jksadhjksd",   "sceneId":"KERFJKOVDJKDSS",   "sceneName":"场景3"  } ]}

每个对象里面都带上了重复的一个sessionId数据,我想提出来该怎么办?

我想改为如下形式,sessionId提出到外层,更能体现出一个sessionId对应多个sceneId和sceneName的含义,这样也便于前端取数据,不然每个对象都要增加一个sessionId属性,太麻烦。扩展:接私活儿

"data": {  "sessionId""jksadhjksd",  "sceneList": [   {    "sceneId":"NDJWKSDSJKDKED",    "sceneName":"场景1"   },   {    "sceneId":"KLJSDJKLSDFALK",    "sceneName":"场景2"   },   {    "sceneId":"KERFJKOVDJKDSS",    "sceneName":"场景3"   }  ] }}

2.实体类

方法如下,首先创建两个实体类。

public class SceneVO private String sessionId; private List<SubSceneVO> sceneList; // 省略对应的getter和setter方法}public class SubSceneVO private String sceneId; private String sceneName; // 省略对应的getter和setter方法}

3.自定义Mapper和xml文件

public interface BusinessScenesCustomMapper SceneVO selectBySessionId(String sessionId);}<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="你的包名.mapper.BusinessScenesCustomMapper">    <resultMap id="BaseResultMap" type="你的包名.vo.SceneVO">        <result column="session_id" jdbcType="VARCHAR" property="sessionId"/>    <!--      collection 标签:用于定义关联的list集合类型的封装规则      property:对应父类中list属性名,这里SceneVO类里的List变量名为sceneList      ofType:集合存放的类型,List集合要装的类的类名,这里是SubSceneVO    -->        <collection property="sceneList" ofType="你的包名.vo.SubSceneVO">            <result column="scene_id" jdbcType="VARCHAR" property="sceneId"/>            <result column="scene_name" jdbcType="VARCHAR" property="sceneName"/>        </collection>    </resultMap><!-- 一个session_id对应多条记录,返回的是SceneVO对象,SceneVO对象有一个List装着SubSceneVO  -->    <select id="selectBySessionId" parameterType="string" resultMap="BaseResultMap">        select session_id, scene_id, scene_name        from 表名        where session_id = #{sessionId,jdbcType=VARCHAR}    </select></mapper>
  • collection标签: 用于定义关联的List集合类型的封装规则
  • property属性: 对应父类中List集合的变量名,这里SceneVO类里的List变量名为sceneList
  • ofType属性: 集合存放的类型,List集合要装的类的类名,这里是SubSceneVO

4.Service层

public interface SceneService /** * 获取场景信息 */ SceneVO getScenesInfo(String sessionId);}@Servicepublic class SceneServiceImpl @Resource private BusinessScenesCustomMapper businessScenesCustomMapper; ...... public SceneVO getScenesInfo(String sessionId) {  return businessScenesCustomMapper.selectBySessionId(sessionId); }}

5.Controller层

......@Resourceprivate SceneService sceneService;@GetMapping("/getScenesInfo")public ResModel getScenesInfo(String sessionId) { SceneVO sceneVO = sceneService.getScenesInfo(sessionId); return ResModel.ok(sceneVO);}

欢迎大家进行观点的探讨和碰撞,各抒己见。如果你有疑问,也可以找我沟通和交流。


最后给读者整理了一份BAT大厂面试真题,需要的可扫码回复“面试题”即可获取。


公众号后台回复 架构 或者 架构整洁 有惊喜礼包!顶级架构师交流群

 「顶级架构师」建立了读者架构师交流群,大家可以添加小编微信进行加群。欢迎有想法、乐于分享的朋友们一起交流学习。

扫描添加好友邀你进架构师群,加我时注明姓名+公司+职位】


版权申明:内容来源网络,版权归原作者所有。如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

猜你还想看

推荐一套开源通用后台管理系统(附源码)

看看人家那 IM 即时通讯系统,那叫一个优雅(附源码)

面试官:生成订单30分钟未支付,则自动取消,该怎么实现?

阿里技术专家:一文教你高效画出技术架构图

牛逼!接私活必备的 N 个系统项目!赶快收藏吧(附源码合集第 3 期)!

优惠券超发事故:扣了我3个月绩效...

使用 Docker 高效搭建本地开发环境(详细教程)

如何做到0.2秒复制100G文件?

为什么基于etcd的分布式锁要比Redis锁安全

公司架构师常常提起的DNS负载均衡是个什么鬼?

重试框架 Spring-Retry 和 Guava-Retry,你知道该怎么选吗?

震惊了,原来这才是Kafka的“真面目”?!

将Bean放入Spring容器中的五种方式


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存